package com.jt.redis.auth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
/**在此配置类中配置令牌的生成，存储策略，验签方式(令牌合法性)
 *
 * */
@Configuration
public class TokenConfig {
    /**
     * 定义签名key，在执行后命令牌签名是xuy
     * */
    private static final String SIGNING_KEY = "auth";
    /**
     * 定义令牌生成策略
     * 配置令牌的存储策略，对于oauth2规范中提供了这样的集中策略
     * 1.JdbcTokenStore此对象将token存储到关系型数据库
     * 2.RedisTokenStore此对象将token存储到radis数据库k:v格式
     * 3.wtTokenStore此对象将token存储到客户端，并且token可以自包含一些用户信息
     * */
    @Bean
    public TokenStore tokenStore(){

        return new JwtTokenStore(jwtAccessTokenConverter());
    }
    /**令牌的创建及验签方式
     * 定义JWT转换器，负责生成JWT令牌，解析令牌内容
     * 基于此对象创建的令牌信息会封装到OAuth2AccessToken类型的对象中
     * 然后再存储到TokenStore对象，外界需要时，会从tokenstore进行获取
     * */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter(){
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        //设置加密/解密口令
        /*jwt令牌构成：header(签名算法，令牌类型),payload(数据部分),signing(签名)
        * 这里的签名可以理解为加密，加密时会使用
        *
        * */
        converter.setSigningKey(SIGNING_KEY);
        return converter;
    }
}
